import fs from 'fs';
import puppeteer from 'puppeteer';

/**
 * 将 SVG 文件转换为 PNG 图片
 * @param {string} svgPath - SVG 文件的相对路径
 * @param {Object} options - 可选配置
 * @param {number} options.width - 输出 PNG 的宽度（可选，默认使用 SVG 原始尺寸）
 * @param {number} options.height - 输出 PNG 的高度（可选，默认使用 SVG 原始尺寸）
 * @param {string} options.outputPath - 输出文件路径（可选，默认为同名 PNG 文件）
 * @param {number} options.scale - 缩放比例（可选，默认为 1）
 * @returns {Promise<string>} 返回生成的 PNG 文件路径
 */

interface Option {
  width?: number;
  height?: number;
  outputPath?: string;
  scale?: number;
}

//todo 增加图片分辨率：（1、放大图片缩放）
export async function svg2png(svgPath: string, options: Option = {}) {
  let browser;

  try {
    // 检查 SVG 文件是否存在
    if (!fs.existsSync(svgPath)) {
      throw new Error(`SVG 文件不存在: ${svgPath}`);
    }

    // 读取 SVG 文件内容
    const svgContent = fs.readFileSync(svgPath, 'utf8');

    // 解析 SVG 尺寸
    const widthMatch = svgContent.match(/width="([^"]+)"/);
    const heightMatch = svgContent.match(/height="([^"]+)"/);
    const viewBoxMatch = svgContent.match(/viewBox="([^"]+)"/);

    let width = options.width;
    let height = options.height;

    // 如果没有指定尺寸，尝试从 SVG 中获取
    if (!width || !height) {
      if (widthMatch && heightMatch) {
        width = width || parseInt(widthMatch[1]);
        height = height || parseInt(heightMatch[1]);
      } else if (viewBoxMatch) {
        const viewBox = viewBoxMatch[1].split(' ');
        width = width || parseInt(viewBox[2]);
        height = height || parseInt(viewBox[3]);
      } else {
        // 默认尺寸
        width = width || 800;
        height = height || 600;
      }
    }

    // 应用缩放
    const scale = options.scale || 1;
    const finalWidth = Math.round(width * scale);
    const finalHeight = Math.round(height * scale);

    // 启动 Puppeteer
    browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });

    const page = await browser.newPage();

    // 设置视口大小
    await page.setViewport({
      width: finalWidth,
      height: finalHeight,
      deviceScaleFactor: 1
    });

    // 创建 HTML 内容
    const htmlContent = `
      <!DOCTYPE html>
      <html>
        <head>
          <style>
            body {
              margin: 0;
              padding: 0;
              width: ${finalWidth}px;
              height: ${finalHeight}px;
              overflow: hidden;
            }
            svg {
              width: 100%;
              height: 100%;
            }
          </style>
        </head>
        <body>
          ${svgContent}
        </body>
      </html>
    `;

    // 设置页面内容
    await page.setContent(htmlContent);

    // 等待页面加载完成
    await new Promise(resolve => setTimeout(resolve, 500));

    // 生成输出文件路径
    const outputPath = options.outputPath || svgPath.replace(/\.svg$/i, '.png');

    // 截图并保存为 PNG
    await page.screenshot({
      path: outputPath,
      type: 'png',
      clip: {
        x: 0,
        y: 0,
        width: finalWidth,
        height: finalHeight
      }
    });
    // console.error(`✅ SVG 转换成功: ${svgPath} -> ${outputPath}`);
    return outputPath;
  } catch (error) {
    console.error(`❌ SVG 转换失败: ${error.message}`);
    throw error;
  } finally {
    if (browser) {
      await browser.close();
    }
  }
}

// // 如果直接运行此文件，执行示例转换
// if (import.meta.url === `file://${process.argv[1]}`) {
//   // 示例用法
//   const exampleSvgPath = './generated-design.svg';

//   if (fs.existsSync(exampleSvgPath)) {
//     svg2png(exampleSvgPath)
//       .then(pngPath => {
//         console.log(`🎉 转换完成！PNG 文件已保存到: ${pngPath}`);
//       })
//       .catch(error => {
//         console.error('转换失败:', error.message);
//       });
//   } else {
//     console.log('示例 SVG 文件不存在，请提供有效的 SVG 文件路径');
//   }
// }